package com.vr.xuecheng.media.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.vr.xuecheng.base.response.PageResult;
import com.vr.xuecheng.base.response.Result;
import com.vr.xuecheng.media.model.dto.MediaFilesPageQueryParamsDTO;
import com.vr.xuecheng.media.model.dto.UploadFileDTO;
import com.vr.xuecheng.media.model.entity.MediaFiles;
import com.vr.xuecheng.media.model.vo.MediaFilesPageVO;
import com.vr.xuecheng.media.model.vo.UploadFileVO;
import org.springframework.web.multipart.MultipartFile;

/**
 * <p>
 * 媒资信息 服务类
 * </p>
 *
 * @author hzh
 */
public interface IMediaFilesService extends IService<MediaFiles> {
    /**
     * @param file 文件对象
     * @return {@code UploadFileVO } 结果
     * 上传文件
     */
    UploadFileVO upload(MultipartFile file);

    /**
     * @param md5           保存的md5值
     * @param uploadFileDTO 上传文件信息dto
     * @param objectName    对象名称
     * @param bucketName    桶名称
     * @return {@code UploadFileVO } 结果
     */
    UploadFileVO saveUploadFileToDb(String md5, UploadFileDTO uploadFileDTO, String objectName, String bucketName);

    /**
     * @param req 分页参数
     * @return {@code PageResult<MediaFilesPageVO> } 分页结果
     */
    PageResult<MediaFilesPageVO> page(MediaFilesPageQueryParamsDTO req);

    /**
     * @param fileId 文件id
     * @return int 删除条数
     * 删除文件
     */
    int deleteById(String fileId);

    /**
     * @param fileMd5 文件的md5值也是id
     * @return boolean 是否存在
     * 1、检查文件是否存在
     */
    boolean checkFile(String fileMd5);

    /**
     * @param fileMd5    分块前的文件的Md5值
     * @param chunkIndex 分块序号
     * @return boolean 是否存在
     * 2、检查分块是否存在
     */
    boolean checkChunk(String fileMd5, int chunkIndex);

    /**
     * @param file       分块文件
     * @param fileMd5    分块前文件的md5值
     * @param chunkIndex 分块序号
     * @return {@code Result<String> } 分块上传结果
     * 3、检验通过，分块上传
     */
    Result<Boolean> uploadChunk(MultipartFile file, String fileMd5, int chunkIndex);

    /**
     * @param fileMd5 分块前文件md5值
     * @param fileName 分块前文件名
     * @param chunkTotal 分块总数
     * @return {@code Result<Boolean> } 是否合并成功
     * 4、完成分块上传，开始合并分块
     */
    Result<Boolean> mergeChunks(String fileMd5, String fileName, int chunkTotal);

    /**
     * @param file 文件
     * @param objectName 上传文件名，可包含目录如：/test/1/1.png
     * @return {@code Boolean }
     * 远程的文件上床
     */
    Boolean upload(MultipartFile file, String objectName);


}
